/**
 * SQLite3数据库初始化模块
 * model/sqlite/init.js
 * 1. npm install sqlite3
 * 2. API文档: https://github.com/TryGhost/node-sqlite3/wiki/API
 */

// 导入Node.js文件模块
const fs = require("fs");
// 导入SQLite3模块
const sqlite3 = require("sqlite3").verbose();
// 导入工具模块
const util = require("../../common/util");
// 导入配置模块
const config = require("../../common/config");

// SQL语句：创建Book数据表
const sqlCreateBook = `
    CREATE TABLE IF NOT EXISTS books(
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        title VARCHAR(255) NOT NULL,
        pic TEXT,
        local_pic TEXT,
        author VARCHAR(255),
        publisher VARCHAR(255),
        producer VARCHAR(255),
        subtitle VARCHAR(255),
        originalTitle VARCHAR(255),
        translator VARCHAR(255),
        pubdate VARCHAR(255),
        pages VARCHAR(255),
        price VARCHAR(255),
        binding VARCHAR(255),
        series VARCHAR(255),
        isbn VARCHAR(255) NOT NULL,
        intro TEXT,
        doubanId  VARCHAR(255),
        createdTime DATETIME NOT NULL,
        updatedTime DATETIME NOT NULL
    );
`;

// SQL语句：创建User数据表
const sqlCreateUser = `
    CREATE TABLE IF NOT EXISTS users(
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        username VARCHAR(255) NOT NULL,
        password VARCHAR(255) NOT NULL,
        nickname VARCHAR(255),
        truename VARCHAR(255),
        avatar VARCHAR(255),
        role INTEGER NOT NULL,
        last_login_time DATETIME NOT NULL,
        last_login_ip VARCHAR(255) NOT NULL,
        login_count INTEGER DEFAULT 0,
        created_time DATETIME NOT NULL,
        created_ip VARCHAR(255) NOT NULL,
        updated_time DATETIME NOT NULL
    );
`;

// SQL语句：创建Bookshelf数据表
const sqlCreateBookshelf = `
    CREATE TABLE IF NOT EXISTS bookshelves(
        id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
        user_id INTEGER NOT NULL,
        book_id INTEGER NOT NULL,
        read_status INTEGER DEFAULT 0,
        ranking INTEGER DEFAULT 0,
        created_time DATETIME NOT NULL,
        updated_time DATETIME NOT NULL
    );
`;

// SQL语句：创建User数据表中的第一个用户
const sqlCreateAdminUser = `
    INSERT INTO users(
        username, password, nickname, truename, avatar,
        role, last_login_time, last_login_ip, login_count, created_time,
        created_ip, updated_time
    ) VALUES (
      'admin', '${util.md5pwd("123456")}', '系统管理员', '超级管理员', './images/default.png', 
      1, datetime('now'), 'never login', 0, datetime('now'), 'system init', datetime('now')
    );
`;

/**
 * SqliteDB构造函数
 * @constructor
 */
function SqliteDB() {
  this.dbFile = config.dbFile;
  // 检查数据库文件是否存在
  if (!fs.existsSync(this.dbFile)) {
    util.log("SQLite数据库文件【mylibrary.db】不存在，开始创建...");
    this.initDB();
  } else {
    util.log("SQLite数据库文件【mylibrary.db】已存在");
    // 尝试打开数据库并验证其完整性
    this.openDB();
  }
}

/**
 * 尝试打开数据库并验证其完整性
 */
SqliteDB.prototype.openDB = function () {
  let db = new sqlite3.Database(this.dbFile, (err) => {
    if (err) {
      util.err("打开数据库失败：", err);
    } else {
      util.log("数据库已成功打开");
    }
  });

  db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='users'", (err, row) => {
    if (err) {
      util.err("查询用户表失败：", err);
    } else if (!row) {
      util.log("用户表不存在，开始初始化数据库...");
      db.close();
      this.initDB();
    } else {
      util.log("用户表已存在");
      // 检查其他表是否存在
      db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='books'", (err, row) => {
        if (err) {
          util.err("查询书籍表失败：", err);
        } else if (!row) {
          util.log("书籍表不存在，开始初始化数据库...");
          db.close();
          this.initDB();
        } else {
          util.log("书籍表已存在");
        }
      });

      db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='bookshelves'", (err, row) => {
        if (err) {
          util.err("查询书架表失败：", err);
        } else if (!row) {
          util.log("书架表不存在，开始初始化数据库...");
          db.close();
          this.initDB();
        } else {
          util.log("书架表已存在");
        }
      });
    }
  });
};

/**
 * 执行初始化数据库的SQL语句
 */
SqliteDB.prototype.initDB = function () {
  let db = new sqlite3.Database(this.dbFile, (err) => {
    if (err) {
      util.err("数据库连接失败：", err);
      return;
    }
    util.log("数据库连接成功");
  });

  db.serialize(() => {
    db.run(sqlCreateBook, (err) => {
      if (err) {
        util.err("创建数据表Book失败：", err);
      } else {
        util.log("数据表Book创建成功");
      }
    });

    db.run(sqlCreateUser, (err) => {
      if (err) {
        util.err("创建数据表User失败：", err);
      } else {
        util.log("数据表User创建成功");
      }
    });

    db.run(sqlCreateBookshelf, (err) => {
      if (err) {
        util.err("创建数据表Bookshelf失败：", err);
      } else {
        util.log("数据表Bookshelf创建成功");
      }
    });

    db.run(sqlCreateAdminUser, (err) => {
      if (err) {
        util.err("创建管理员用户失败：", err);
      } else {
        util.log("管理员用户创建成功");
      }
    });
  });

  // 确保所有的数据库操作都完成后再关闭数据库连接
  db.on('close', () => {
    util.log("数据库连接已关闭");
  });

  // 这里暂时不关闭数据库连接，因为db.serialize是异步的
  // db.close();
};

module.exports = SqliteDB;